package intelligentCustomer.reasoning;

import dev.langchain4j.model.chat.ChatLanguageModel;
import dev.langchain4j.model.input.Prompt;
import dev.langchain4j.model.input.PromptTemplate;

import java.util.HashMap;
import java.util.Map;

/**
 * 问题分析步骤
 * 分析用户查询，提取关键问题点
 */
public class ProblemAnalysisStep implements ReasoningStep {
    /** 大语言模型 */
    private final ChatLanguageModel model;
    
    /** 提示模板 */
    private static final PromptTemplate PROMPT_TEMPLATE = PromptTemplate.from(
        "分析以下用户查询，提取关键问题点和潜在需求。\n" +
        "用户查询: {{query}}\n" +
        "用户意图: {{intent}}\n" +
        "相关知识: {{knowledge}}\n\n" +
        "请提供详细分析，包括:\n" +
        "1. 主要问题点\n" +
        "2. 潜在的隐含需求\n" +
        "3. 问题的优先级\n" +
        "4. 可能的约束条件\n\n" +
        "以JSON格式返回结果，包含以上四个字段。"
    );
    
    /**
     * 构造函数
     * 
     * @param model 大语言模型
     */
    public ProblemAnalysisStep(ChatLanguageModel model) {
        this.model = model;
    }
    
    /**
     * 执行问题分析步骤
     * 
     * @param context 推理上下文
     */
    @Override
    public void execute(ReasoningContext context) {
        try {
            // 准备提示参数
            Map<String, Object> variables = new HashMap<>();
            variables.put("query", context.getQuery());
            variables.put("intent", context.getIntent().getCategory());
            variables.put("knowledge", context.getRelevantKnowledge());
            
            // 生成提示
            Prompt prompt = PROMPT_TEMPLATE.apply(variables);
            
            // 调用模型进行分析
            String analysis = model.generate(prompt.text());
            
            // 解析分析结果
            // 实际应用中应该使用JSON解析库
            
            // 将分析结果添加到推理链
            context.addReasoningStep(getName(), analysis);
            
            // 将分析结果存储到上下文
            context.setAttribute("problemAnalysis", analysis);
            
            // 设置置信度
            context.setConfidence(0.8);
        } catch (Exception e) {
            context.setSuccessful(false);
            context.addReasoningStep(getName(), "分析失败: " + e.getMessage());
        }
    }
    
    /**
     * 获取步骤名称
     * 
     * @return 步骤名称
     */
    @Override
    public String getName() {
        return "问题分析";
    }
} 